package net.sxnic.item.ucenter;

import java.util.List;
import java.util.Map;
import java.util.Set;

import javassist.NotFoundException;
import net.sxinfo.core.dao.Page;
import net.sxinfo.core.dao.hibernate3.HibernateCriteria;
import net.sxnic.ugr.dept.Dept;
import net.sxnic.ugr.group.Group;
import net.sxnic.ugr.menu.Menu;
import net.sxnic.ugr.role.Role;
import net.sxnic.ugr.user.User;
import net.sxnic.ugr.user.UserDisabledException;
import net.sxnic.ugr.user.UserNotExistsException;
import net.sxnic.ugr.user.WrongPasswordException;
import net.sxnic.ugr.website.Website;

import org.springframework.transaction.annotation.Transactional;

/**
 * 在子系统中，所有涉及到用户、组、角色、部门、菜单、子系统的方法，统一在此定义。在此实现，这样可以使用户中心和业务系统无缝合并与分开
 * 
 * @author yfsun
 * 
 */
@Transactional
public interface UcenterService {

	/**
	 * 验证登陆，成功返回User对象，失败返回NULL
	 * 
	 * @param userName
	 *            用户名
	 * @param password
	 *            密码
	 * @return
	 */
	User login(String userName, String password) throws UserNotExistsException,
			UserDisabledException, WrongPasswordException;

	/**
	 * 更新User实体
	 * 
	 * @param user
	 */
	void updateUser(User user);

	/**
	 * 根据用户名获取User对象
	 * 
	 * @param userName
	 *            用户名
	 * @return User对象
	 */
	User findUserByUserName(String userName);

	/**
	 * 查询指定用户可访问的WebSite列表
	 * 
	 * @param userName
	 *            用户名
	 * @return WebSite列表
	 */
	List<Website> findWebSitesByUserName(String userName);
	
	/**
	 * 查询指定用户名的角色列表
	 * @param userName 用户名
	 * @return
	 */
	Set<Role> findRolesByUserName(String userName);

	/**
	 * 查询指定用户配置的Menu列表
	 * 
	 * @param userName
	 *            用户名
	 * @return Menu列表
	 */
	List<Menu> findMenusByUserName(String userName);

	/**
	 * 验证指定用户 有无指定大类、小类的审批权限，如果有则返回true，否则返回false
	 * 
	 * @param userName
	 *            用户名
	 * @param catalog1
	 *            大类别名
	 * @param catalog2
	 *            小类编码
	 * @return
	 */
	boolean canVerifyCatalogByUserName(String userName, String catalog1,
			String catalog2);
	
	
	/**
	 * 根据用户查询任务的执行者。申报单位的任务执行者是自己的userName，其他都是所在单位的deptCode
	 * @param user
	 * @return
	 * @throws NotFoundException
	 */
	String findTaskAssignee(User user)  throws NotFoundException;
	
	/**
	 * 根据部门查询任务的执行者。申报单位的任务执行者是自己的userName，其他都是所在单位的deptCode
	 * @param dept
	 * @return
	 * @throws NotFoundException
	 */
	String findTaskAssignee(Dept dept)  throws NotFoundException;	
	
	boolean isUserInRole(User user,Role role);
	boolean isUserInRole(User user,String role);
	boolean isUserInRole(User user,String... roles);
	
	List<User> findUsersByDept(Dept dept);
	
	
	Dept getDeptById(String id);
	Dept findDeptByCode(String deptCode);
	List<Dept> findDeptsByUser(User user);
	void saveDept(Dept dept);
	Page getDeptPage(int page,int pageSize,HibernateCriteria hc);
	
	Role getRoleById(String id);
	Role getRoleByCode(String code);
	void saveRole(Role role);
	Page getRolePage(int page,int pageSize,HibernateCriteria hc);
	
	Group getGroupById(String id);
	Group getGroupByCode(String code);
	void saveGroup(Group group);
	Page getGroupPage(int page,int pageSize,HibernateCriteria hc);
	
	Menu getMenuById(String id);
	Menu getMenuByCode(String code);
	void saveMenu(Menu menu);
	Page getMenutPage(int page,int pageSize,HibernateCriteria hc);
	Map<String, String> findUserMenus(String userName);
	List<Menu> getTopLevelMenus();
	List<Menu> getSubLevel(String parentMenuCode);
}
